package cn.java.threadmodel.producerconsumer.queue;

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;

/**
 * @author 小石潭记
 * @date 2021/12/18 10:23
 * @Description:  * 阻塞队列实现生产者-消费者模型
 *                * 对应的阻塞方法是put()/take()
 */
public class ProducerConsumerQueue<E> {

    /**
     * 队列最大容量
     */
    private final static int QUEUE_MAX_SIZE = 3;
    /**
     * 存放元素的队列
     */
    private BlockingQueue<E> queue;

    public ProducerConsumerQueue() {
        queue = new LinkedBlockingQueue<>(QUEUE_MAX_SIZE);
    }

    /**
     * 向队列中添加元素
     * @param e
     * @return
     */
    public boolean put(E e) {
        try {
            queue.put(e);
            System.out.println(Thread.currentThread().getName() + " -> 生产元素，元素个数为：" + queue.size());
        } catch (InterruptedException e1) {
            e1.printStackTrace();
        }
        return true;
    }

    /**
     * 从队列中取出元素
     * @return
     */
    public E get() {
        try {
            E e = queue.take();
            System.out.println(Thread.currentThread().getName() + " -> 消费元素，元素个数为：" + queue.size());
            return e;
        } catch (InterruptedException e1) {
            e1.printStackTrace();
        }
        return null;
    }
}